package com.stefanini.pe.bbva.bp.in.bo.impl;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.stefanini.pe.bbva.bp.in.bo.iface.PropuestaBOIface;
import com.stefanini.pe.bbva.bp.in.dao.iface.PropuestaDAOIface;
import com.stefanini.pe.bbva.bp.in.to.Propuesta;

@Service("propuestaBO")
public class PropuestaBOImpl implements PropuestaBOIface {

	@Autowired
	private PropuestaDAOIface propuestaDAOIface;

	public List consultarPortafolio(Propuesta propuesta) {
		HashMap map = this.propuestaDAOIface.consultarPortafolio(propuesta);
		DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
		simbolos.setDecimalSeparator('.');
		DecimalFormatSymbols f3=new DecimalFormatSymbols(Locale.US);
		DecimalFormat format=new DecimalFormat("#,##0.0",f3);
		DecimalFormat formatPeso = new DecimalFormat("######0.0",f3);
		
		List lista = (List)map.get("result");
		double montoAcciones = Double.parseDouble(map.get("out_montocat5")+"");		
		double montoBonos = Double.parseDouble(map.get("out_montocat6")+"");
				
		List resultado = new ArrayList();
		String catProd = "0";
		List listaSub = new ArrayList();
		Propuesta rPropuesta = new Propuesta();
		Propuesta tPropuesta = new Propuesta();
		String descripcion = "";
		for(int i=0;i<lista.size();i++){
			Propuesta oPropuesta = (Propuesta)lista.get(i);				
			if(i==0){
				catProd = oPropuesta.getCatProducto();
			}
			if(catProd.equalsIgnoreCase(oPropuesta.getCatProducto())){				
				
				tPropuesta.setDescripcion("TOTALES");
				tPropuesta.setMontoActual((Double.parseDouble(tPropuesta.getMontoActual())+ Double.parseDouble(oPropuesta.getMontoActual()))+"");
				tPropuesta.setPesoMontoTotalActual((Double.parseDouble(tPropuesta.getPesoMontoTotalActual())+ Double.parseDouble(oPropuesta.getPesoMontoTotalActual()))+""); 
				tPropuesta.setMontoTotalSugerido((Double.parseDouble(tPropuesta.getMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getMontoTotalSugerido()))+"");
				tPropuesta.setPesoMontoTotalSugerido((Double.parseDouble(tPropuesta.getPesoMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getPesoMontoTotalSugerido()))+"");
				tPropuesta.setMontoOperacion((Double.parseDouble(tPropuesta.getMontoOperacion())+ Double.parseDouble(oPropuesta.getMontoOperacion()))+"");
				
				rPropuesta.setDescripcion(oPropuesta.getDescripcionTotal());
				rPropuesta.setMontoActual((Double.parseDouble(rPropuesta.getMontoActual())+ Double.parseDouble(oPropuesta.getMontoActual()))+"");
				rPropuesta.setPesoMontoTotalActual((Double.parseDouble(rPropuesta.getPesoMontoTotalActual())+ Double.parseDouble(oPropuesta.getPesoMontoTotalActual()))+""); 
				rPropuesta.setMontoTotalSugerido((Double.parseDouble(rPropuesta.getMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getMontoTotalSugerido()))+"");
				rPropuesta.setPesoMontoTotalSugerido((Double.parseDouble(rPropuesta.getPesoMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getPesoMontoTotalSugerido()))+"");
				rPropuesta.setMontoOperacion((Double.parseDouble(rPropuesta.getMontoOperacion())+ Double.parseDouble(oPropuesta.getMontoOperacion()))+"");
				
				oPropuesta.setMontoActual(format.format(Double.parseDouble(oPropuesta.getMontoActual())));
				oPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(oPropuesta.getPesoMontoTotalActual()))); 
				oPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(oPropuesta.getMontoTotalSugerido())));
				oPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(oPropuesta.getPesoMontoTotalSugerido())));
				oPropuesta.setMontoOperacion(format.format(Double.parseDouble(oPropuesta.getMontoOperacion())));
				
				listaSub.add(oPropuesta);
			}else{
				rPropuesta.setSubLista(listaSub);	
				rPropuesta.setMontoActual(format.format(Double.parseDouble(rPropuesta.getMontoActual())));
				rPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalActual()))); 
				rPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(rPropuesta.getMontoTotalSugerido())));
				rPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalSugerido())));
				rPropuesta.setMontoOperacion(format.format(Double.parseDouble(rPropuesta.getMontoOperacion())));
				resultado.add(rPropuesta);				
				catProd = oPropuesta.getCatProducto();
				rPropuesta = new Propuesta();
				listaSub = new ArrayList();
				i--;
			}
		}
		
		rPropuesta.setSubLista(listaSub);
		rPropuesta.setMontoActual(format.format(Double.parseDouble(rPropuesta.getMontoActual())));
		rPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalActual()))); 
		rPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(rPropuesta.getMontoTotalSugerido())));
		rPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalSugerido())));
		rPropuesta.setMontoOperacion(format.format(Double.parseDouble(rPropuesta.getMontoOperacion())));
		resultado.add(rPropuesta);
		
		tPropuesta.setMontoActual(format.format(Double.parseDouble(tPropuesta.getMontoActual())));
		//tPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(tPropuesta.getPesoMontoTotalActual()))); 
		tPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble("100")));
		tPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(tPropuesta.getMontoTotalSugerido())));
		//tPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(tPropuesta.getPesoMontoTotalSugerido())));
		tPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble("100")));
		tPropuesta.setMontoOperacion(format.format(Double.parseDouble(tPropuesta.getMontoOperacion())));
		
		List listaTotal = new ArrayList();
		listaTotal.add(resultado);
		listaTotal.add(tPropuesta);
		listaTotal.add(montoAcciones);
		listaTotal.add(montoBonos);
		return listaTotal;		
	}
	
	public List consultarPortafolioRpt(Propuesta propuesta){
		HashMap map = this.propuestaDAOIface.consultarPortafolio(propuesta);
		List lista = (List)map.get("result");
		DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
		simbolos.setDecimalSeparator('.');
		DecimalFormat format = new DecimalFormat("######0.0",simbolos);		
		DecimalFormat formatPeso = new DecimalFormat("######0.0",simbolos);
		List resultado = new ArrayList();
		String catProd = "0";
		List listaSub = new ArrayList();
		Propuesta rPropuesta = new Propuesta();
		Propuesta tPropuesta = new Propuesta();
		String descripcion = "";
		List listaReporte = new ArrayList();
		for(int i=0;i<lista.size();i++){
			Propuesta oPropuesta = (Propuesta)lista.get(i);				
			if(i==0){
				catProd = oPropuesta.getCatProducto();
			}
			if(catProd.equalsIgnoreCase(oPropuesta.getCatProducto())){
				
				tPropuesta.setDescripcion("TOTALES");
				tPropuesta.setMontoActual((Double.parseDouble(tPropuesta.getMontoActual())+ Double.parseDouble(oPropuesta.getMontoActual()))+"");
				tPropuesta.setPesoMontoTotalActual((Double.parseDouble(tPropuesta.getPesoMontoTotalActual())+ Double.parseDouble(oPropuesta.getPesoMontoTotalActual()))+""); 
				tPropuesta.setMontoTotalSugerido((Double.parseDouble(tPropuesta.getMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getMontoTotalSugerido()))+"");
				tPropuesta.setPesoMontoTotalSugerido((Double.parseDouble(tPropuesta.getPesoMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getPesoMontoTotalSugerido()))+"");
				tPropuesta.setMontoOperacion((Double.parseDouble(tPropuesta.getMontoOperacion())+ Double.parseDouble(oPropuesta.getMontoOperacion()))+"");
				
				rPropuesta.setDescripcion(oPropuesta.getDescripcionTotal());
				rPropuesta.setMontoActual((Double.parseDouble(rPropuesta.getMontoActual())+ Double.parseDouble(oPropuesta.getMontoActual()))+"");
				rPropuesta.setPesoMontoTotalActual((Double.parseDouble(rPropuesta.getPesoMontoTotalActual())+ Double.parseDouble(oPropuesta.getPesoMontoTotalActual()))+""); 
				rPropuesta.setMontoTotalSugerido((Double.parseDouble(rPropuesta.getMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getMontoTotalSugerido()))+"");
				rPropuesta.setPesoMontoTotalSugerido((Double.parseDouble(rPropuesta.getPesoMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getPesoMontoTotalSugerido()))+"");
				rPropuesta.setMontoOperacion((Double.parseDouble(rPropuesta.getMontoOperacion())+ Double.parseDouble(oPropuesta.getMontoOperacion()))+"");
				
				oPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(oPropuesta.getPesoMontoTotalActual())));
				oPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(oPropuesta.getPesoMontoTotalSugerido())));
				
				listaReporte.add(oPropuesta);
			}else{
				rPropuesta.setSubLista(listaSub);	
				rPropuesta.setMontoActual(format.format(Double.parseDouble(rPropuesta.getMontoActual())));
				rPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalActual()))); 
				rPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(rPropuesta.getMontoTotalSugerido())));
				rPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalSugerido())));
				rPropuesta.setMontoOperacion(format.format(Double.parseDouble(rPropuesta.getMontoOperacion())));
				listaReporte.add(rPropuesta);
				catProd = oPropuesta.getCatProducto();
				rPropuesta = new Propuesta();
				listaSub = new ArrayList();
				i--;
			}
		}
		
		rPropuesta.setSubLista(listaSub);
		rPropuesta.setMontoActual(format.format(Double.parseDouble(rPropuesta.getMontoActual())));
		rPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalActual()))); 
		rPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(rPropuesta.getMontoTotalSugerido())));
		rPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalSugerido())));
		rPropuesta.setMontoOperacion(format.format(Double.parseDouble(rPropuesta.getMontoOperacion())));
		listaReporte.add(rPropuesta);
				
		tPropuesta.setMontoActual(format.format(Double.parseDouble(tPropuesta.getMontoActual())));
		tPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(tPropuesta.getMontoTotalSugerido())));
		tPropuesta.setMontoOperacion(format.format(Double.parseDouble(tPropuesta.getMontoOperacion())));
		tPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(tPropuesta.getPesoMontoTotalActual())));
		tPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(tPropuesta.getPesoMontoTotalSugerido())));	
		
		listaReporte.add(tPropuesta);
		
		return listaReporte;
	}
	
	public List consultarDistribucion(Propuesta propuesta){
		return propuestaDAOIface.consultarDistribucion(propuesta);
	}
	
	public List consultarMonedaDistr(Propuesta propuesta){
		DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
		simbolos.setDecimalSeparator('.');
		DecimalFormat format = new DecimalFormat("######0.0",simbolos);		
		DecimalFormat formatPeso = new DecimalFormat("######0.0",simbolos);
		List lista = propuestaDAOIface.consultarMonedaDistr(propuesta);
		List listaAntes = new ArrayList();
		List listaDespues = new ArrayList();
		for(int i=0;i<lista.size();i++){
			LinkedHashMap map = (LinkedHashMap)lista.get(i);
			String tipo = map.get("tipo")+"";
			map.put("pesoValor", map.get("peso"));
			map.put("peso", formatPeso.format(Double.parseDouble(map.get("peso")+"")));			
			if(tipo.equalsIgnoreCase("ANTES")){
				listaAntes.add(map);
			}else{
				listaDespues.add(map);
			}
		}				
		List listResult = new ArrayList();
		listResult.add(listaAntes);
		listResult.add(listaDespues);
		
		return listResult;
	}
	
	public List consultarMonedaDistrRpt(Propuesta propuesta){
		DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
		simbolos.setDecimalSeparator('.');
		DecimalFormat format = new DecimalFormat("######0.0",simbolos);		
		DecimalFormat formatPeso = new DecimalFormat("######0.0",simbolos);
		List lista = propuestaDAOIface.consultarMonedaDistr(propuesta);
		List listaAntes = new ArrayList();
		List listaDespues = new ArrayList();
		for(int i=0;i<lista.size();i++){
			LinkedHashMap map = (LinkedHashMap)lista.get(i);
			String tipo = map.get("tipo")+"";
			map.put("peso", formatPeso.format(Double.parseDouble(map.get("peso")+"")));
			if(tipo.equalsIgnoreCase("ANTES")){
				listaAntes.add(map);
			}else{
				listaDespues.add(map);
			}
		}
		HashMap map = new HashMap();
		map.put("moneda", "Total");
		map.put("peso", "100.0%");
		listaAntes.add(map);
		listaDespues.add(map);
		
		List listResult = new ArrayList();
		listResult.add(listaAntes);
		listResult.add(listaDespues);
		
		return listResult;
	}
	
	public List listaCotizaClase(String tipoRenta){
		return propuestaDAOIface.listaCotizaClase(tipoRenta);
	}
	
	public List listaCotizacion(String isin, String nemonico, String tipoRenta, String idCodClase){
		return propuestaDAOIface.listaCotizacion(isin, nemonico, tipoRenta, idCodClase);
	}
	
	public int inserRebalanceo(HashMap map){
		return propuestaDAOIface.inserRebalanceo(map);
	}
	
	public Map<String,Object>  listSimulacion(String idTemporal, String idResumen){
		return propuestaDAOIface.listSimulacion(idTemporal, idResumen);
	}
	
	public List listReporteRebalanceo(HashMap map){
		return propuestaDAOIface.listReporteRebalanceo(map);
	}
	
		
	public List consultarPortafolioNoCliente(Propuesta propuesta) {
		HashMap map = this.propuestaDAOIface.consultarPortafolio(propuesta);
		DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
		simbolos.setDecimalSeparator('.');
		DecimalFormatSymbols f3=new DecimalFormatSymbols(Locale.US);
		DecimalFormat format=new DecimalFormat("#,##0.0",f3);
		DecimalFormat formatPeso = new DecimalFormat("######0.0",simbolos);
		
		List lista = (List)map.get("result");
		double montoAcciones = Double.parseDouble(map.get("out_montocat5")+"");		
		double montoBonos = Double.parseDouble(map.get("out_montocat6")+"");
				
		List resultado = new ArrayList();
		String catProd = "0";
		List listaSub = new ArrayList();
		Propuesta rPropuesta = new Propuesta();
		Propuesta tPropuesta = new Propuesta();
		String descripcion = "";
		for(int i=0;i<lista.size();i++){
			Propuesta oPropuesta = (Propuesta)lista.get(i);				
			if(i==0){
				catProd = oPropuesta.getCatProducto();
			}
			if(catProd.equalsIgnoreCase(oPropuesta.getCatProducto())){				
				
				tPropuesta.setDescripcion("TOTALES");
				tPropuesta.setMontoActual((Double.parseDouble(tPropuesta.getMontoActual())+ Double.parseDouble(oPropuesta.getMontoActual()))+"");
				tPropuesta.setPesoMontoTotalActual((Double.parseDouble(tPropuesta.getPesoMontoTotalActual())+ Double.parseDouble(oPropuesta.getPesoMontoTotalActual()))+""); 
				tPropuesta.setMontoTotalSugerido((Double.parseDouble(tPropuesta.getMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getMontoTotalSugerido()))+"");
				tPropuesta.setPesoMontoTotalSugerido((Double.parseDouble(tPropuesta.getPesoMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getPesoMontoTotalSugerido()))+"");
				tPropuesta.setMontoOperacion((Double.parseDouble(tPropuesta.getMontoOperacion())+ Double.parseDouble(oPropuesta.getMontoOperacion()))+"");
				
				rPropuesta.setDescripcion(oPropuesta.getDescripcionTotal());
				rPropuesta.setMontoActual((Double.parseDouble(rPropuesta.getMontoActual())+ Double.parseDouble(oPropuesta.getMontoActual()))+"");
				rPropuesta.setPesoMontoTotalActual((Double.parseDouble(rPropuesta.getPesoMontoTotalActual())+ Double.parseDouble(oPropuesta.getPesoMontoTotalActual()))+""); 
				rPropuesta.setMontoTotalSugerido((Double.parseDouble(rPropuesta.getMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getMontoTotalSugerido()))+"");
				rPropuesta.setPesoMontoTotalSugerido((Double.parseDouble(rPropuesta.getPesoMontoTotalSugerido())+ Double.parseDouble(oPropuesta.getPesoMontoTotalSugerido()))+"");
				rPropuesta.setMontoOperacion((Double.parseDouble(rPropuesta.getMontoOperacion())+ Double.parseDouble(oPropuesta.getMontoOperacion()))+"");
				
				oPropuesta.setMontoActual(format.format(Double.parseDouble(oPropuesta.getMontoActual())));
				oPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(oPropuesta.getPesoMontoTotalActual()))); 
				oPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(oPropuesta.getMontoTotalSugerido())));
				oPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(oPropuesta.getPesoMontoTotalSugerido())));
				oPropuesta.setMontoOperacion(format.format(Double.parseDouble(oPropuesta.getMontoOperacion())));
				
				listaSub.add(oPropuesta);
			}else{
				rPropuesta.setSubLista(listaSub);	
				rPropuesta.setMontoActual(format.format(Double.parseDouble(rPropuesta.getMontoActual())));
				rPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalActual()))); 
				rPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(rPropuesta.getMontoTotalSugerido())));
				rPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalSugerido())));
				rPropuesta.setMontoOperacion(format.format(Double.parseDouble(rPropuesta.getMontoOperacion())));
				resultado.add(rPropuesta);				
				catProd = oPropuesta.getCatProducto();
				rPropuesta = new Propuesta();
				listaSub = new ArrayList();
				i--;
			}
		}
		
		rPropuesta.setSubLista(listaSub);
		rPropuesta.setMontoActual(format.format(Double.parseDouble(rPropuesta.getMontoActual())));
		rPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalActual()))); 
		rPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(rPropuesta.getMontoTotalSugerido())));
		rPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(rPropuesta.getPesoMontoTotalSugerido())));
		rPropuesta.setMontoOperacion(format.format(Double.parseDouble(rPropuesta.getMontoOperacion())));
		resultado.add(rPropuesta);
		
		tPropuesta.setMontoActual(format.format(Double.parseDouble(tPropuesta.getMontoActual())));
		tPropuesta.setPesoMontoTotalActual(formatPeso.format(Double.parseDouble(tPropuesta.getPesoMontoTotalActual()))); 
		tPropuesta.setMontoTotalSugerido(format.format(Double.parseDouble(tPropuesta.getMontoTotalSugerido())));
		tPropuesta.setPesoMontoTotalSugerido(formatPeso.format(Double.parseDouble(tPropuesta.getPesoMontoTotalSugerido())));
		tPropuesta.setMontoOperacion(format.format(Double.parseDouble(tPropuesta.getMontoOperacion())));
		
		List listaTotal = new ArrayList();
		listaTotal.add(resultado);
		listaTotal.add(tPropuesta);
		listaTotal.add(montoAcciones);
		listaTotal.add(montoBonos);
		return listaTotal;		
	}
}
